const jwt = require('jsonwebtoken')
const { userRegisterError, userLoginError } = require('../constant/err.type')
const { createUser, getUserInfo, updataById } = require('../service/users.service')
const { JWT_SECRET } = require('../config/config.default.js')
class UserController {
  // 注册
  async register(ctx, next) {
    // 获取数据
    const { username, password } = ctx.request.body
    // 操作数据库 // 获取到了注册信息
    try {
      const res = await createUser(username, password)
      //返回结果
      ctx.body = {
        code: 0,
        message: '注册成功!',
        data: {
          id: res.id,
          name: res.username
        }
      }
    } catch (err) {
      // 处理登录错误
      console.log(err)
      ctx.app.emit('error', userRegisterError, ctx)
    }
  }

  // 登录
  async login(ctx, next) {
    const { username } = ctx.request.body

    try {
      // 不能返回密码 , 解构出除了密码以外的其他值
      const { password, ...res } = await getUserInfo({ username })
      ctx.body = {
        code: 0,
        message: '登录成功',
        data: {
          // 第一个参数是用户除密码外的信息 , 第二个是私钥随便定义 , 第三个是配置 , 可以定义过期时间 ,一天
          token: jwt.sign(res, JWT_SECRET, { expiresIn: '1d' })
        }
      }
    } catch (err) {
      console.error('登录失败!', err)
      ctx.app.emit('error', userLoginError, ctx)
    }
  }

  // 修改密码
  async changePassword(ctx, next) {
    // 获取数据
    const id = ctx.state.user.id
    const password = ctx.request.body.password
    try {
      // 操作数据库
      const flag = await updataById({ id, password })
      // 返回结果
      if (flag) {
        ctx.body = {
          code: 0,
          message: '密码修改成功',
          data: {}
        }
      } else {
        console.log('修改失败')
        ctx.app.emit('error', { code: "999999", message: '修改失败', data: {} }, ctx)
      }
    } catch (err) {
      console.error('修改失败!', err)
    }
  }
}

module.exports = new UserController()